Перейти к основному содержимому

5.16. Управляющие конструкции и операторы

Разработчику Архитектору

Управляющие конструкции и операторы

COBOL — язык программирования, разработанный в конце 1950-х годов с целью создания читаемых, структурированных и легко поддерживаемых программ для обработки бизнес-данных. Одной из ключевых особенностей COBOL является его ориентация на естественный язык, что делает синтаксис максимально приближённым к человеческой речи. Эта черта проявляется не только в именах переменных или структур данных, но и в самих управляющих конструкциях и операторах, которые выражают действия в виде глаголов: MOVE, ADD, PERFORM, EVALUATE и других. Такой подход позволяет программисту формулировать логику программы как последовательность команд, понятных даже тем, кто не обладает техническим образованием.

Управляющие конструкции в COBOL определяют порядок выполнения инструкций. Они позволяют организовать ветвление, повторение и вызов подпрограмм. Операторы языка реализуют базовые действия над данными: арифметические вычисления, перемещение значений, работа с файлами и управление потоком выполнения. В совокупности эти элементы образуют основу любой программы на COBOL, обеспечивая возможность моделирования сложных бизнес-процессов с высокой степенью точности и надёжности.

Условное ветвление: оператор IF

Оператор IF в COBOL используется для организации условного выполнения блока кода. Он проверяет истинность логического выражения и, если условие выполняется, передаёт управление соответствующему фрагменту программы. Синтаксис этого оператора следует естественному языку: после ключевого слова IF указывается условие, затем — последовательность действий, которые должны быть выполнены при его истинности. При необходимости предусмотреть альтернативный путь, используется конструкция ELSE. Завершается блок ключевым словом END-IF.

Пример:

IF SALARY IS GREATER THAN 50000
DISPLAY "Высокий доход"
ELSE
DISPLAY "Стандартный доход"
END-IF

В этом примере программа сравнивает значение переменной SALARY с числом 50000. Если значение больше, выводится сообщение «Высокий доход», в противном случае — «Стандартный доход». Условия в COBOL могут включать сравнения чисел, строк, дат, а также логические операции AND, OR и NOT. Все условия формулируются в декларативной манере, что делает их легко читаемыми и проверяемыми.

Особенностью COBOL является то, что условия часто используют специальные фразы, такие как IS EQUAL TO, IS NOT LESS THAN, IS NEGATIVE, IS ZERO, что усиливает семантическую ясность. Эти фразы заменяют символические операторы, принятые в других языках, и делают код ближе к описанию реальных бизнес-правил.

Повторение и модульность: оператор PERFORM

Оператор PERFORM в COBOL играет роль универсального средства управления потоком выполнения. Он может использоваться как для организации циклов, так и для вызова подпрограмм (параграфов или секций). Это один из самых гибких и часто используемых операторов в языке.

В простейшей форме PERFORM вызывает выполнение указанного параграфа — именованного блока кода, определённого в разделе процедур. Например:

PERFORM CALCULATE-TAX

Эта команда передаёт управление параграфу с именем CALCULATE-TAX, который содержит последовательность инструкций для расчёта налога. После завершения выполнения параграфа управление возвращается к следующей строке после PERFORM.

Для организации циклов PERFORM принимает дополнительные параметры. Например, можно указать количество повторений:

PERFORM PROCESS-RECORD 10 TIMES

Эта команда выполнит параграф PROCESS-RECORD десять раз подряд.

Также поддерживаются циклы с условием. Цикл может выполняться до тех пор, пока условие остаётся истинным (WITH TEST BEFORE или WITH TEST AFTER), или пока условие не станет ложным. Пример:

PERFORM UNTIL COUNTER IS GREATER THAN 100
ADD 1 TO COUNTER
DISPLAY COUNTER
END-PERFORM

Здесь цикл продолжается, пока значение переменной COUNTER не превысит 100. На каждой итерации переменная увеличивается на единицу, и её текущее значение выводится на экран.

Ещё одна форма — PERFORM VARYING, которая позволяет управлять циклом с помощью счётчика, аналогично циклу for в других языках:

PERFORM VARYING I FROM 1 BY 1 UNTIL I > 10
DISPLAY "Итерация: " I
END-PERFORM

В этом случае переменная I инициализируется значением 1, увеличивается на 1 на каждой итерации и цикл завершается, когда I становится больше 10.

Гибкость PERFORM делает его центральным элементом структурирования логики в COBOL. Он способствует модульности, повторному использованию кода и читаемости программы, поскольку каждый параграф обычно представляет собой законченную бизнес-операцию.

Множественный выбор: оператор EVALUATE

Оператор EVALUATE в COBOL предоставляет механизм множественного выбора, аналогичный конструкции switch или case в других языках программирования. Однако в COBOL он реализован в более выразительной и гибкой форме. EVALUATE позволяет сравнивать значение одного или нескольких выражений с набором возможных вариантов и выполнять соответствующий блок кода.

Простейший пример:

EVALUATE EMPLOYEE-GRADE
WHEN 'A'
COMPUTE BONUS = SALARY * 0.2
WHEN 'B'
COMPUTE BONUS = SALARY * 0.15
WHEN 'C'
COMPUTE BONUS = SALARY * 0.1
WHEN OTHER
COMPUTE BONUS = 0
END-EVALUATE

Здесь в зависимости от значения переменной EMPLOYEE-GRADE рассчитывается размер бонуса. Конструкция WHEN OTHER обрабатывает все остальные возможные значения, не перечисленные явно.

Особенность EVALUATE заключается в том, что он может работать не только с одним значением, но и с логическими условиями. Например:

EVALUATE TRUE
WHEN SALARY > 100000 AND YEARS-OF-SERVICE > 10
DISPLAY "Премиум-статус"
WHEN SALARY > 50000
DISPLAY "Стандартный статус"
WHEN OTHER
DISPLAY "Базовый статус"
END-EVALUATE

В этом случае каждое условие в блоке WHEN проверяется последовательно, и выполняется первый подходящий вариант. Такой подход позволяет строить сложные правила принятия решений без вложения множества IF.

Оператор EVALUATE поддерживает также составные условия и сравнения нескольких переменных одновременно, что делает его мощным инструментом для реализации бизнес-логики, основанной на комбинациях факторов.


Работа с внешними данными: файловые операторы

COBOL изначально создавался для обработки больших объёмов данных, хранящихся во внешних файлах. Поэтому язык содержит встроенные средства для открытия, чтения, записи и закрытия файлов. Эти операции реализуются с помощью четырёх основных глаголов: OPEN, READ, WRITE и CLOSE. Каждый из них соответствует определённому этапу жизненного цикла работы с файлом и строго следует последовательности, принятой в бизнес-приложениях.

Оператор OPEN инициализирует доступ к файлу. Он указывает, как именно программа будет взаимодействовать с файлом: только для чтения (INPUT), только для записи (OUTPUT), для добавления новых записей (EXTEND) или для одновременного чтения и обновления (I-O). Пример:

OPEN INPUT CUSTOMER-FILE

Эта команда открывает файл CUSTOMER-FILE в режиме чтения. Система проверяет наличие файла, его доступность и соответствие описанию в разделе FILE SECTION программы. Если всё в порядке, файл становится готовым к последующим операциям.

После открытия файла данные считываются с помощью оператора READ. Он загружает одну запись из файла в соответствующую переменную, описанную в рабочей памяти программы. Например:

READ CUSTOMER-FILE
AT END
MOVE 'YES' TO EOF-FLAG
END-READ

Здесь программа читает очередную запись из CUSTOMER-FILE. Если достигнут конец файла, устанавливается флаг EOF-FLAG, что позволяет корректно завершить цикл обработки. Конструкция AT END — стандартный способ обработки ситуации, когда больше нет данных для чтения.

Для сохранения данных используется оператор WRITE. Он помещает содержимое переменной в файл. Важно, что перед записью программа должна подготовить данные в рабочей области, соответствующей структуре записи файла. Пример:

MOVE 'Иванов Иван' TO CUSTOMER-NAME
MOVE 12345 TO CUSTOMER-ID
WRITE CUSTOMER-RECORD

Эта последовательность команд формирует новую запись и сохраняет её в файл. В зависимости от типа организации файла (последовательный, индексированный, относительный) запись может размещаться в конце, по ключу или по номеру.

Завершает работу с файлом оператор CLOSE. Он освобождает системные ресурсы, сбрасывает буферы и гарантирует целостность данных. Пример:

CLOSE CUSTOMER-FILE

Без явного вызова CLOSE изменения могут не сохраниться, особенно в системах, где буферизация применяется по умолчанию. Поэтому каждому OPEN должен соответствовать CLOSE в логически завершённой части программы.

Файловые операции в COBOL тесно связаны с описанием данных в разделе DATA DIVISION. Там указывается структура каждой записи, тип файла, метод доступа и другие атрибуты. Это обеспечивает строгую типизацию и предсказуемость поведения программы при работе с внешними источниками данных.

Арифметические и управляющие глаголы: MOVE, ADD, SUBTRACT, MULTIPLY, DIVIDE

COBOL использует глагольную форму для выражения действий над данными. Эти глаголы не только выполняют вычисления, но и перемещают значения, изменяют состояние переменных и управляют потоком данных внутри программы. Все они имеют чёткую семантику и следуют принципу «действие → объект».

Оператор MOVE — один из самых часто используемых. Он копирует значение из одного элемента данных в другой. Например:

MOVE 100 TO BALANCE
MOVE CUSTOMER-NAME TO DISPLAY-NAME

Первая команда присваивает переменной BALANCE числовое значение 100. Вторая — копирует строку из CUSTOMER-NAME в DISPLAY-NAME. MOVE автоматически преобразует данные, если это допустимо: например, число может быть скопировано в поле с десятичной точкой, строка — в поле фиксированной длины с дополнением пробелами. Такое поведение упрощает обработку данных, но требует внимательного описания полей, чтобы избежать потери точности или усечения.

Арифметические операции в COBOL реализованы через отдельные глаголы, каждый из которых выполняет одно действие:

  • ADD — прибавляет одно или несколько значений к целевому полю.
  • SUBTRACT — вычитает указанное значение из целевого поля.
  • MULTIPLY — умножает целевое поле на заданный множитель.
  • DIVIDE — делит целевое поле на делитель, с возможностью получения остатка.

Примеры:

ADD 500 TO SALARY
SUBTRACT DISCOUNT FROM TOTAL-AMOUNT
MULTIPLY QUANTITY BY PRICE GIVING LINE-TOTAL
DIVIDE TOTAL-COST BY NUMBER-OF-ITEMS GIVING AVERAGE-COST REMAINDER LEFTOVER

В этих командах явно указаны источники, цели и результаты операций. Фраза GIVING определяет, куда поместить результат. Фраза REMAINDER в DIVIDE позволяет получить остаток от деления, что особенно полезно в финансовых расчётах, где важно учитывать копейки или центы.

Особенность арифметических глаголов COBOL — их способность работать с группами полей. Например, можно сложить все элементы таблицы одной командой:

ADD CORRESPONDING INVOICE-DETAIL TO TOTAL-RECORD

Эта команда складывает поля с одинаковыми именами из двух составных записей. Такой подход упрощает агрегацию данных без необходимости перечислять каждое поле вручную.

Все арифметические операции в COBOL выполняются с учётом точности, масштаба и формата чисел, заданных в описании переменных. Это исключает неожиданные ошибки округления и обеспечивает соответствие результатов требованиям бухгалтерских и финансовых стандартов.